Alteryxのカスタム関数
こんにちは、小澤です。
Alteryxでは、Formulaツールなどのツールの設定値として式を書くものが存在します。 この式の中では様々な関数が利用できるのですが、 場合によっては単一の関数のみではできず複雑な式を書く必要がある場面に遭遇することもあります。
今回は、「頻繁に書く式なんだけど関数としては用意されていない!」を解消する方法としてカスタム関数を見ていきたいと思います。
カスタム関数とは
カスタム関数はFormula式の中での特定の計算を行う処理を1つの関数として定義してしまう機能です。 例えば、以下のような計算があるとします。
[Field_1] + [Field_2]
これは2つの値の足し算を行うものになっています。 これに対して、カスタム関数として以下のようなものを定義しておきます。
- 関数名 : ADD
- 処理 : P1 + P2
このカスタム関数を定義すると、以下のようにFormula式で利用可能になります。
ADD([Field_1], [Field_2])
処理中のP1, P2がそれぞれ渡された引数で置き換えられて足し算の処理が行われるわけです。 もちろん、足し算のためにわざわざカスタム関数を用意する必要はないですが、計算がちょっと複雑になるものをカスタム関数化すれば手軽に利用できるというわけです。
カスタム関数を作ってみる
では、実際にカスタム関数を作ってみましょう。
関数化する処理の実装
まずは、関数化したい処理を実装します。 今回は「2017/4/17」のような文字列から日付型の変数を作成するような処理を考えます。
Alteryxでは「2017/04/17」のようなゼロ埋めで桁数が統一されているものであればDateTimeツールなどを使って日付型への変換が可能ですが、桁数が統一されていないものには対応していません。 そのため、まずこの処理を行うFormula式を書きます。
ToDate( REGEX_Replace([input], "(\d+)/(\d+)/(\d+)", "$1") + "-" + PadLeft(REGEX_Replace([input], "(\d+)/(\d+)/(\d+)", "$2"), 2, "0") + "-" + PadLeft(REGEX_Replace([input], "(\d+)/(\d+)/(\d+)", "$3"), 2, "0") )
すごく長くて複雑ですね... 何をしているか簡単に説明すると、
- REGEX_Peplace関数で正規表現でそれぞれ年月日のパーツを取り出し
- 月日に関しては、2桁になるようにPadLeft関数で左側を0埋め
- それぞれを"-"で接続してYYYY-MM-DDの形式にする
- ToDate関数で日付型に変換
となっています。 この形式の変換は割とありがちですが、毎回この式を書くとなるとなかなか大変ですね。 そこでカスタム関数の出番です。
カスタム関数として定義する
では、この処理をカスタム関数化してみましょう。 カスタム関数は、XMLファイルで定義します。
<?xml version="1.0" encoding="utf-8"?> <FormulaAddIn> <Function> <Name>SingleDigitDate</Name> <NumParams variable="false">1</NumParams> <Category>Date</Category> <InsertText>SingleDigitDate(String)</InsertText> <Description>Signle digit String date to Date type.</Description> <Formula> ToDate( REGEX_Replace(P1, "(\d+)/(\d+)/(\d+)", "$1") + "-" + PadLeft(REGEX_Replace(P1, "(\d+)/(\d+)/(\d+)", "$2"), 2, "0") + "-" + PadLeft(REGEX_Replace(P1, "(\d+)/(\d+)/(\d+)", "$3"), 2, "0") ) </Formula> </Function> </FormulaAddIn>
各項目は以下のように設定します。
項目 | 値 |
---|---|
Name | 呼び出し時に利用する関数名 |
NumParams | 引数の数 |
Category | 関数一覧のカテゴリ |
InsertText | 関数一覧での表示 |
Description | 関数一覧でポップアップで表示される説明 |
Formula | 計算式 |
となります。 CategoryやInsertTextを適切に設定することで補完時の関数一覧に以下のように表示されます。 CategoryはDateTimeが適切な気がしますが、スクリーンショットで見やすいようにDateというカテゴリを追加しています(存在しないカテゴリを入れると勝手に追加されます)。
Formula式の中では、NumParamsで設定した値の数だけP1, P2, P3,...と変数が利用可能です。 今回は引数が1つのみなのでP1を利用しています。
Formulaツールから以下のように利用できます。 カスタム関数呼び出し時に渡された変数inputが計算式のP1に渡されて処理が実行されます。
カスタム関数を利用できるようにする
XMLファイルでカスタム関数の定義ができました。 最後にこのファイルをAlteryxから読み込んで、カスタム関数が利用可能な状態にする必要があります。
カスタム関数として認識させるには、 <Alteryxのインストールフォルダ>\bin\RuntimeData\FormulaAddIn フォルダに配置します。 AlteryxのAdmin版の場合、デフォルトではC:\Program Files\Alteryx\bin\RuntimeData\FormulaAddInとなりますので、 ファイルの配置には管理者権限が必要になります。
複数の関数を定義する
カスタム関数を複数定義する方法は2種類あります。
- XMLファイル内でカスタム関数を複数定義
- 複数のXMLファイルを用意する
これらは併用することも可能です。 1つのファイルに複数の関数を定義する際は以下のようにFunctionタグを複数配置します。
<?xml version="1.0" encoding="utf-8"?> <FormulaAddIn> <Function> <Name>SingleDigitToDate</Name> <NumParams variable="false">1</NumParams> <Category>Date</Category> <InsertText>SingleDigitToDate(String)</InsertText> <Description>Signle digit String date to Date type.</Description> <Formula> ToDate( REGEX_Replace(P1, "(\d+)/(\d+)/(\d+)", "$1") + "-" + PadLeft(REGEX_Replace(P1, "(\d+)/(\d+)/(\d+)", "$2"), 2, "0") + "-" + PadLeft(REGEX_Replace(P1, "(\d+)/(\d+)/(\d+)", "$3"), 2, "0") ) </Formula> </Function> <Function> <Name>DateToSingleDigit</Name> <NumParams variable="false">1</NumParams> <Category>Date</Category> <InsertText>DateToSingleDigit(String)</InsertText> <Description>Date to Signle digit String date.</Description> <Formula> ToString(DateTimeYear(P1)) + "/" + ToString(DateTimeMonth(P1)) + "/" + ToString(DateTimeDay(P1)) </Formula> </Function> </FormulaAddIn>
おわりに
今回はAlteryxでカスタムFormula関数を定義する方法を紹介しました。 結構よく利用するんだけど、内容が複雑になるFormula式がある、という場合にはぜひ活用して見てください。
Alteryxの導入なら、クラスメソッドにおまかせください
日本初のAlteryxビジネスパートナーであるクラスメソッドが、Alteryxの導入から活用方法までサポートします。14日間の無料トライアルも実施中ですので、お気軽にご相談ください。